/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package compilador.analisadorSintatico.metodos;

import compilador.analisadorLexico.PalavraReservada;
import compilador.analisadorLexico.Token;
import compilador.analisadorLexico.TokenClass;
import compilador.analisadorSintatico.Producao;
import compilador.analisadorSintatico.TokenReader;
import compilador.analisadorSintatico.simboloGramatical.NaoTerminal;
import compilador.analisadorSintatico.simboloGramatical.SimboloGramatical;
import compilador.analisadorSintatico.simboloGramatical.Terminal;

/**
 *
 * @author nelson
 */
public class PARAM extends Producao {

    @Override
    public SimboloGramatical derivar() throws Exception {
        //pega a instância do tokenReader
        TokenReader tokenReader = TokenReader.getInstance();
        //consome o primeiro token
        Token t = tokenReader.seeCurrent();

        if (tokenReader.seeCurrent().getAtributo().equals(PalavraReservada.NEW) ||
                tokenReader.seeCurrent().getAtributo().equals(PalavraReservada.WRITE) ||
                tokenReader.seeCurrent().getAtributo().equals(PalavraReservada.READ) ||
                tokenReader.seeCurrent().getAtributo().equals("-") ||
                tokenReader.seeCurrent().getAtributo().equals("(") ||
                tokenReader.seeCurrent().getAtributo().equals("!") ||
                tokenReader.seeCurrent().getTokenClass().equals(TokenClass.NUMERO) ||
                tokenReader.seeCurrent().getTokenClass().equals(TokenClass.IDENTIFICADOR)) {
            
            ((NaoTerminal)this.simbolo).add(new VALOR().derivar());
            ((NaoTerminal)this.simbolo).add(new PARAM_X().derivar());
        
        } else {
            erro("Faltando um '!', '-', '(', número, identificador, 'read', 'new' ou 'write' ");
            return this.simbolo;
        }
        return this.simbolo;
    }

    @Override
    public void setSimbolo() {

        this.simbolo = new NaoTerminal("PARAM");

    }

    private class PARAM_X extends Producao {

        @Override
        public SimboloGramatical derivar() throws Exception {
            //pega a instância do tokenReader
            TokenReader tokenReader = TokenReader.getInstance();
            //consome o primeiro token
            Token t = tokenReader.seeCurrent();
            //cria um símbolo
            NaoTerminal PARAM = (NaoTerminal)this.simbolo;

            if (t.getAtributo().equals(",")) {
                ((NaoTerminal)this.simbolo).add(new Terminal(tokenReader.consome()));
                ((NaoTerminal)this.simbolo).add(new VALOR().derivar());
            }

            return this.simbolo;
        }

        @Override
        public void setSimbolo() {

            this.simbolo = new NaoTerminal("PARAM");

        }
    }
}
